package com.hanlin.backend.common.aspect;

import com.hanlin.backend.common.annotation.CodeDate;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * 描述：aop切面
 * @author:hl.yuan
 * @date:2021-02-20
 */
@Aspect
@Component
@Slf4j
public class MyAspect {

    /**
     * 定义切入点，把需要添加的附加功能，给放进去
     */
    @Pointcut("@annotation(date)")
    public void codeDate(CodeDate date){
    }

    /**
     * 环绕通知
     * @param point 目标方法
     * @return 返回值
     * @throws Throwable 返回的异常对象
     */
    @Around("codeDate(date)")
    public Object around(ProceedingJoinPoint point,CodeDate date) throws Throwable {
        Signature signature = point.getSignature();
        // 包名+类+方法名称
        String name = signature.getDeclaringTypeName()+"."+signature.getName();
        long srtTime = System.currentTimeMillis();
        // 执行方法
        Object result = null;
        try {
            result = point.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }finally {
            log.info("【{}性能计算】 {} 开始时间：{}",date.title(),name,srtTime);
            long endTime = System.currentTimeMillis();
            log.info("【{}性能计算】 {} 结束时间：{}，最终耗时: {}",date.title(),name,endTime,endTime-srtTime);
        }
        return result;
    }





}
